package factory;

import influence_radii.Angular;
import influence_radii.Linear;
import influence_radii.Radial;
import skills.ActiveSkill;
import skills.BargainSkill;
import skills.DetectTrapSkill;
import skills.ObservationSkill;
import skills.PickpocketSkill;
import skills.RemoveTrapSkill;
import stat.NonEntityStatList;
import stat.StatType;
import effects.DamageEffect;
import effects.HealEffect;

public class SkillInitializer {
	
    /**
     * initialize the SkillFactory with all the skills
     */
	public static void initSkillFactory() {
		
		 // Bane Skills
		 
		DamageEffect fireBallEffect = new DamageEffect( "fireBall", new NonEntityStatList() );
		fireBallEffect.addRelevantStat( StatType.INT, StatType.STR );
		fireBallEffect.addOutputStat( StatType.HP );
		ActiveSkill fireBall = new ActiveSkill( "fireBall", 3, fireBallEffect, new Linear(), 1, 5, 1, 1, 5 );
		SkillFactory.addActiveSkill( fireBall );
		
		DamageEffect iceWaveEffect = new DamageEffect( "iceWave", new NonEntityStatList() );
		iceWaveEffect.addRelevantStat( StatType.INT, StatType.AGI );
		iceWaveEffect.addOutputStat( StatType.HP );
		ActiveSkill iceWave = new ActiveSkill( "iceWave", 3, iceWaveEffect, new Angular(), 1, 5, 1, 2, 7 );
		SkillFactory.addActiveSkill( iceWave );
		
		DamageEffect earthQuakeEffect = new DamageEffect( "earthQuake", new NonEntityStatList() );
		earthQuakeEffect.addRelevantStat( StatType.INT, StatType.HAR );
		earthQuakeEffect.addOutputStat( StatType.HP );
		ActiveSkill earthQuake = new ActiveSkill( "earthQuake", 3, earthQuakeEffect, new Radial(), 1, 5, 1, 3, 10 );
		SkillFactory.addActiveSkill( earthQuake );
		
		
		 // Boon Skills
		 
		HealEffect healingLightEffect = new HealEffect( "healingLight", new NonEntityStatList() );
		healingLightEffect.addRelevantStat( StatType.INT, StatType.LEVEL );
		healingLightEffect.addOutputStat( StatType.HP );
		ActiveSkill healingLight = new ActiveSkill( "healingLight", 1, healingLightEffect, new Linear(), 0, 5, 0, 1, 4 );
		SkillFactory.addActiveSkill( healingLight );
		
/*		HealEffect berserkEffect = new HealEffect( "berserk", new NonEntityStatList() );
		berserkEffect.addRelevantStat( StatType.INT, StatType.LEVEL );
		berserkEffect.addOutputStat( StatType.OFFENSIVERATING );
		ActiveSkill berserk = new ActiveSkill( "berserk", 1, berserkEffect, new Linear(), 0, 0, 0, 1, 10 );
		SkillFactory.addActiveSkill( berserk );
		
		HealEffect protectEffect = new HealEffect( "protect", new NonEntityStatList() );
		protectEffect.addRelevantStat( StatType.INT, StatType.LEVEL );
		protectEffect.addOutputStat( StatType.DEFENSIVERATING );
		ActiveSkill protect = new ActiveSkill( "protect", 1, protectEffect, new Linear(), 0, 0, 0, 1, 10 );
		SkillFactory.addActiveSkill( protect );*/
		
		
		 // Weapon Skills 
		 
		DamageEffect oneHandedEffect = new DamageEffect( "oneHanded", new NonEntityStatList() );
		oneHandedEffect.addRelevantStat( StatType.STR, StatType.OFFENSIVERATING );
		oneHandedEffect.addOutputStat( StatType.HP );
		ActiveSkill oneHanded = new ActiveSkill( "oneHanded", 1, oneHandedEffect, new Linear(), 1, 5, 0, 1, 0 );
		SkillFactory.addActiveSkill( oneHanded );
		
		DamageEffect twoHandedEffect = new DamageEffect( "twoHanded", new NonEntityStatList() );
		twoHandedEffect.addRelevantStat( StatType.STR, StatType.OFFENSIVERATING );
		twoHandedEffect.addOutputStat( StatType.HP );
		ActiveSkill twoHanded = new ActiveSkill( "twoHanded", 1, twoHandedEffect, new Linear(), 1, 5, 0, 1, 0 );
		SkillFactory.addActiveSkill( twoHanded );
		
		DamageEffect rangedEffect = new DamageEffect( "ranged", new NonEntityStatList() );
		rangedEffect.addRelevantStat( StatType.AGI, StatType.OFFENSIVERATING );
		rangedEffect.addOutputStat( StatType.HP );
		ActiveSkill ranged = new ActiveSkill( "ranged", 3, rangedEffect, new Linear(), 1, 5, 1, 2, 0 );
		SkillFactory.addActiveSkill( ranged );
		
		DamageEffect staffEffect = new DamageEffect( "staff", new NonEntityStatList() );
		staffEffect.addRelevantStat( StatType.INT, StatType.OFFENSIVERATING );
		staffEffect.addOutputStat( StatType.HP );
		ActiveSkill staff = new ActiveSkill( "staff", 1, staffEffect, new Linear(), 1, 5, 0, 1, 0 );
		SkillFactory.addActiveSkill( staff );
		
		DamageEffect brawlerEffect = new DamageEffect( "brawler", new NonEntityStatList() );
		brawlerEffect.addRelevantStat( StatType.STR, StatType.AGI, StatType.OFFENSIVERATING );
		brawlerEffect.addOutputStat( StatType.HP );
		ActiveSkill brawler = new ActiveSkill( "brawler", 1, brawlerEffect, new Linear(), 1, 5, 0, 1, 0 );
		SkillFactory.addActiveSkill( brawler );
		
		DamageEffect unarmedEffect = new DamageEffect( "unarmed", new NonEntityStatList() );
		unarmedEffect.addRelevantStat( StatType.STR );
		unarmedEffect.addOutputStat( StatType.HP );
		ActiveSkill unarmed = new ActiveSkill( "unarmed", 1, unarmedEffect, new Linear(), 1, 5, 0, 1, 0 );
		SkillFactory.addActiveSkill( unarmed );
		
		
		 // General Skills 
		 
		HealEffect bindWoundsEffect = new HealEffect( "bindWounds", new NonEntityStatList() );
		bindWoundsEffect.addRelevantStat( StatType.LEVEL, StatType.HAR );
		bindWoundsEffect.addOutputStat( StatType.HP );
		ActiveSkill bindWounds = new ActiveSkill( "bindWounds", 1, bindWoundsEffect, new Linear(), 0, 5, 0, 1, 2 );
		SkillFactory.addActiveSkill( bindWounds );
		
		SkillFactory.addInteractiveSkill( new ObservationSkill( "observation" ) );
		SkillFactory.addInteractiveSkill( new BargainSkill( "bargain" ) );
		
		
		 // Sneak Skills
		 
		SkillFactory.addInteractiveSkill( new DetectTrapSkill( "detectTrap" ) );
		SkillFactory.addInteractiveSkill( new RemoveTrapSkill( "removeTrap" ) );
		SkillFactory.addInteractiveSkill( new PickpocketSkill( "pickPocket" ) );
		
		
		 // Special LOD Skill
		 
		DamageEffect LODEffect = new DamageEffect( "LOD", new NonEntityStatList() );
		unarmedEffect.addRelevantStat(
			StatType.STR,
			StatType.AGI,
			StatType.ARMORRATING,
			StatType.DEFENSIVERATING,
			StatType.HAR,
			StatType.HP,
			StatType.INT,
			StatType.LEVEL,
			StatType.MAXHP,
			StatType.MAXMP,
			StatType.MP,
			StatType.MVT,
			StatType.OFFENSIVERATING
		);
		
		unarmedEffect.addOutputStat(
			StatType.STR,
			StatType.AGI,
			StatType.HAR,
			StatType.HP,
			StatType.INT,
			StatType.LIVES,
			StatType.MP
		);
		
		ActiveSkill LOD = new ActiveSkill( "LOD", 1, LODEffect, new Radial(), 1, 5, 10, 1, 1 );
		SkillFactory.addActiveSkill( LOD );
	}
}

